package org.fenixsoft.jvm.chapter8;

/**
 * 方法动态分派演示
 * @author zzm
 */
public class DynamicDispatch {

    static abstract class Human {
        protected abstract void sayHello();
    }

    static class Man extends Human {
        @Override
        protected void sayHello() {
            System.out.println("man say hello");
        }
    }

    static class Woman extends Human {
        @Override
        protected void sayHello() {
            System.out.println("woman say hello");
        }
    }

    /**
     * 根据"实际类型"选择方法的版本。
     * 下面3个方法调用，在class层面，都是一模一样的，但是因为invokevirtual指令的原因表现除了"多态"
     *
     * 虽然"多态"的字节码指令都是一样的。所以要从invokevirtual指令入手。
     * 查jvm文档，发现invokevirtual指令会调用"实际类型"
     *
     * #6 = Methodref          #12.#25        // org/fenixsoft/jvm/chapter8/DynamicDispatch$Human.sayHello:()V
     *
     */

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        man.sayHello(); // invokevirtual #6                  // Method org/fenixsoft/jvm/chapter8/DynamicDispatch$Human.sayHello:()V
        woman.sayHello(); // invokevirtual #6                  // Method org/fenixsoft/jvm/chapter8/DynamicDispatch$Human.sayHello:()V
        man = new Woman();
        man.sayHello(); // invokevirtual #6                  // Method org/fenixsoft/jvm/chapter8/DynamicDispatch$Human.sayHello:()V
    }
}
